/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.sysdrive.DAO;

import br.com.sysdrive.model.Compra;
import br.com.sysdrive.model.CompraProduto;
import br.com.sysdrive.model.Fornecedor;
import br.com.sysdrive.model.Funcionario;
import br.com.sysdrive.model.Produto;
import br.com.sysdrive.util.ConnectionFactory;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author WillianFrias
 */
public class CompraDAOImpl {

    private Connection conn;
    private ResultSet rs;

    public CompraDAOImpl() throws Exception {
        try {
            this.conn = ConnectionFactory.getConnection();
            System.out.println("Conectado com Sucesso!");
        } catch (Exception ex) {
            throw new Exception(ex.getMessage());
        }
    }

    public Integer cadastrar(Object object) {
        PreparedStatement stmt = null;
        ResultSet rs = null;
        Integer idCompra = null;
        Compra compra = (Compra) object;
        String sql = "insert into compra ("
                + "data_compra, "
                + "status_compra, "
                + "id_funcionario, "
                + "id_fornecedor) "
                + "values (?,?,?,?) returning id_compra;";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setDate(1, new java.sql.Date(compra.getDataCompra().getTime()));
            stmt.setString(2, compra.getStatusCompra());
            stmt.setInt(3, compra.getFuncionario().getIdFuncionario());
            stmt.setInt(4, compra.getFornecedor().getIdFornecedor());
            rs = stmt.executeQuery();

            while (rs.next()) {
                idCompra = rs.getInt("id_compra");
            }

        } catch (SQLException ex) {
            System.out.println("Problemas ao cadastrar Compra! Erro CompraDAO:" + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão! Erro CompraDAO:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return idCompra;
    }

    public List<Object> listar() {
        List<Object> resultado = new ArrayList<Object>();
        PreparedStatement stmt = null;
        ResultSet rs = null;


        String sql = "select c.* "
                + "from compra c;";

        try {
            stmt = conn.prepareStatement(sql);

            rs = stmt.executeQuery();
            while (rs.next()) {
                Compra compra = new Compra();
                compra.setIdCompra(rs.getInt("id_compra"));
                compra.setDataCompra(rs.getDate("data_compra"));
                compra.setStatusCompra(rs.getString("status_compra"));

                PreparedStatement stmt2 = null;
                ResultSet rs2 = null;

                List<CompraProduto> compraProdutos = new ArrayList<CompraProduto>();

                String sql2 = "select cp.*, p.* from compra_produto cp, produto p where cp.id_compra = ? and cp.id_produto = p.id_produto and cp.status_compra_produto <> 'I';";


                try {
                    stmt2 = conn.prepareStatement(sql2);
                    stmt2.setInt(1, compra.getIdCompra());
                    rs2 = stmt2.executeQuery();

                    while (rs2.next()) {
                        Produto produto = new Produto();
                        produto.setIdProduto(rs2.getInt("id_produto"));
                        produto.setNomeProduto(rs2.getString("nome_produto"));

                        CompraProduto compraProduto = new CompraProduto();
                        compraProduto.setQtdCompraProduto(rs2.getDouble("qtd_compra_produto"));
                        compraProduto.setObservacaoCompraProduto(rs2.getString("observacao_compra_produto"));
                        compraProduto.setProduto(produto);
                        compraProduto.setCompra(compra);
                        compraProdutos.add(compraProduto);

                    }
                } catch (SQLException ex) {
                    System.out.println("Problemas ao Listar CompraDAO! Erro: " + ex.getMessage());
                    ex.printStackTrace();
                }
                compra.setCompraProduto(compraProdutos);
                resultado.add(compra);
            }
        } catch (SQLException ex) {
            System.out.println("Problemas ao listar CompraDAO! Erro:" + ex.getMessage());
            ex.printStackTrace();
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parametros de conexao! Erro:" + ex.getMessage());
                ex.printStackTrace();
            }
        }
        return resultado;
    }

    public Object carregar(int idObject) {
        PreparedStatement stmt = null;
        Compra compra = null;
        ResultSet rs = null;
        String sql = "select * from compra where id_compra = ?";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setInt(1, idObject);
            rs = stmt.executeQuery();
            while (rs.next()) {
                compra = new Compra();
                compra.setStatusCompra(rs.getString("status_compra"));
                compra.setDataCompra(rs.getDate("data_compra"));
                compra.setIdCompra(rs.getInt("id_compra"));

                Funcionario funcionario = new Funcionario();
                funcionario.setIdFuncionario(rs.getInt("id_funcionario"));

                Fornecedor fornecedor = new Fornecedor();
                fornecedor.setIdFornecedor(rs.getInt("id_fornecedor"));

                compra.setFuncionario(funcionario);
                compra.setFornecedor(fornecedor);
            }
            return compra;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao Carregar Compra! Erro CompraDAO: " + ex.getMessage());
            ex.printStackTrace();
            return null;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt, rs);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar os parâmetros de conexão Carregar Compra! Erro CompraDAO: " + ex.getMessage());
                ex.printStackTrace();
            }
        }
    }

    public Boolean alterar(Object object) {
        PreparedStatement stmt = null;
        Compra compra = (Compra) object;
        String sql = "update compra set data_compra = ?, status_compra = ?, id_funcionario = ?, id_fornecedor = ?"
                + " where id_compra = ?";
        try {
            stmt = conn.prepareStatement(sql);
            stmt.setDate(1, new java.sql.Date(compra.getDataCompra().getTime()));
            stmt.setString(2, compra.getStatusCompra().toUpperCase());
            stmt.setInt(3, compra.getFuncionario().getIdFuncionario());
            stmt.setInt(4, compra.getFornecedor().getIdFornecedor());
            stmt.setInt(5, compra.getIdCompra());
            stmt.executeUpdate();
            return true;
        } catch (SQLException ex) {
            System.out.println("Problemas no SQL ao alterar Compra! Erro CompraDAO: " + ex.getMessage());
            return false;
        } finally {
            try {
                ConnectionFactory.closeConnection(conn, stmt);
            } catch (Exception ex) {
                System.out.println("Problemas ao fechar parâmetros de conexão Alterar Compra! Erro CompraDAO: " + ex.getMessage());
            }
        }
    }
}
